package es.webapp.exiquets.service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.PersistenceException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import es.webapp.exiquets.domain.entities.User;
import es.webapp.exiquets.domain.entities.UserRole;
import es.webapp.exiquets.domain.entities.Usuariosanonimo;
import es.webapp.exiquets.repository.RolUsuarioDAO;
import es.webapp.exiquets.repository.UsuariosAnonimosDAO;
import es.webapp.exiquets.repository.UsuariosDAO;
import es.webapp.exiquets.utils.eXiquetsConstants;

@Component(value="gestorUsuarios")
public class GestorUsuariosImpl implements GestorUsuarios {
	
	@Autowired
	private UsuariosDAO usuarioDao;
	
	@Autowired
	private RolUsuarioDAO userRoleDao;
	
	@Autowired
	private UsuariosAnonimosDAO usuarioAnonimoDao;
	
	@Autowired
	private GestorRoles gestorRoles;

	public void setUsuarioDao(UsuariosDAO usuarioDao){
		this.usuarioDao = usuarioDao;
	}
	
	public void setUsuarioAnonimoDao(UsuariosAnonimosDAO usuarioAnonimoDao){
		this.usuarioAnonimoDao = usuarioAnonimoDao;
	}
	
	public void setgestorRoles(GestorRoles gestorRoles){
		this.gestorRoles = gestorRoles;
	}
	
	public String registraUsuario(User usuario) {
		String status = eXiquetsConstants.REGISTRO_USUARIO_NUEVO_SUCCES;
		UserRole ur = new UserRole();
		ur.setAuthority("ROLE_USER");
		
		Set<UserRole> roles = new HashSet<UserRole>();
		roles.add(ur);
		
		usuario.setUserRoles(roles);
		ur.setUser(usuario);
		
		usuario.setEnabled(new Byte("1"));
		
		try{
			userRoleDao.save(ur);
		}catch(PersistenceException e){
			status = e.getCause().getCause().getMessage();
		}
		
		return status;
	}

	public User getUsuarioPorMail(String mail) {
		return usuarioDao.getUsuarioPorMail(mail);
	}

	public List<User> getUsuarios() {
		return usuarioDao.findAll();
	}

	public void eliminarUsuario(User usuario) {
		for(UserRole ur : usuario.getUserRoles()){
			userRoleDao.deleteById(ur.getUserRoleId());
		}
	}

	public Usuariosanonimo getUsuarioPorSession(String sesion) {
		Usuariosanonimo user = (Usuariosanonimo) usuarioAnonimoDao.getUsuarioPorSesion(sesion);
		if(user == null){
			user = new Usuariosanonimo();
			user.setIdSesion(sesion);
			usuarioAnonimoDao.save(user);
			user = (Usuariosanonimo) usuarioAnonimoDao.getUsuarioPorSesion(sesion);
		}
		return user ;
	}
	
	public void updateUsuarioAnonimo(Usuariosanonimo usuario){
		usuarioAnonimoDao.update(usuario);
	}
	
	public void updateUsuario(User usuario){
		usuarioDao.update(usuario);	
	}

}
